function [f]=ncread(fname,vname,tindex);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (c) 2002 Rutgers University.                                    %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                                                                           %
% function [f]=ncread(fname,vname,tindex)                                   %
%                                                                           %
% This function reads in a generic multi-dimensional field from a NetCDF    %
% file.                                                                     %
%                                                                           %
% On Input:                                                                 %
%                                                                           %
%    fname       NetCDF file name (character string).                       %
%    vname       NetCDF variable name to read (character string).           %
%    tindex      Optional, time index to read (integer):                    %
%                  *  If argument "tindex" is provided, only the requested  %
%                     time record is read if the variable has unlimitted    %
%                     dimension or the word "time" in any of its dimension  %
%                     names.                                                %
%                                                                           %
% On Output:                                                                %
%                                                                           %
%    f           Field (scalar, matrix or array).                           %
%    status      Error flag.                                                %
%                                                                           %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%  Set-up printing information switch.

global IPRINT

if (isempty(IPRINT)),
    %IPRINT=1;
    IPRINT=0; % PM edit 11/1/2011
end,

%  Activate switch for reading specific record.

time_rec=0;
if (nargin > 2),
    time_rec=1;
end,

% Open NetCDF file.

[ncid]=mexcdf('ncopen',fname,'nc_nowrite');
if (ncid == -1),
    error(['NCREAD: ncopen - unable to open file: ' fname])
    return
end,

% Supress all error messages from NetCDF.

[status]=mexcdf('setopts',0);

%----------------------------------------------------------------------------
% Inquire about requested variable.
%----------------------------------------------------------------------------

% Get variable ID.

[varid]=mexcdf('ncvarid',ncid,vname);
if (varid < 0),
    [status]=mexcdf('ncclose',ncid);
    nc_inq(fname);
    disp('  ');
    error(['NCREAD: ncvarid - cannot find variable: ',vname])
    return
end,

% Inquire about unlimmited dimension.

[ndims,nvars,natts,recdim,status]=mexcdf('ncinquire',ncid);
if (status == -1),
    error(['NCREAD: ncinquire - cannot inquire file: ',fname])
end,

% Get information about requested variable.

[vname,nctype,nvdims,dimids,nvatts,status]=mexcdf('ncvarinq',ncid,varid);
if (status == -1),
    error(['NCREAD: ncvarinq - unable to inquire about variable: ',vname])
end,

% Inquire about dimensions.

index=0;
for n=1:nvdims
    [name,dsize,status]=mexcdf('ncdiminq',ncid,dimids(n));
    if (status == -1),
        error(['NCREAD: ncdiminq - unable to inquire about dimension ID: ',...
            num2str(dimids(n))])
    else
        lstr=length(name);
        dimnam(n,1:lstr)=name(1:lstr);
        dimsiz(n)=dsize;
        start(n)=0;
        count(n)=dsize;
        if ((dimids(n) == recdim) | ~isempty(findstr(name,'time'))),
            index=n;
        end,
    end,
end,

%  It reading specific time record, reset variable bounds.

nvdim=nvdims;
if (time_rec & (index > 0)),
    start(index)=tindex-1;
    count(index)=1;
    nvdims=nvdims-1;
else
    index=0;
end,

%----------------------------------------------------------------------------
% Read in requested variable.
%----------------------------------------------------------------------------

%  Read in scalar.

if (nvdim == 0),
    [f,status]=mexcdf('ncvarget1',ncid,varid,[0]);
    if (status == -1),
        error(['NCREAD: ncvarget1 - error while reading: ',vname])
    end,
    
    %  Read in an element of a vector.
    
elseif (nvdim == 1),
    [f,status]=mexcdf('ncvarget',ncid,varid,start,count);
    if (status == -1),
        error(['NCREAD: ncvarget - error while reading: ',vname])
    end,
    
    %  Read in a vector or a matrix.
    
elseif (nvdims == 1 | nvdims == 2),
    [f,status]=mexcdf('ncvarget',ncid,varid,start,count);
    if (status == -1),
        error(['NCREAD: ncvarget - error while reading: ',vname])
    end,
    
    %  Read in a 3D-array.
    
elseif (nvdims == 3),
    [v,status]=mexcdf('ncvarget',ncid,varid,start,count);
    if (status == -1),
        error(['NCREAD: ncvarget - error while reading: ',vname])
    end,
    if (length(start) == 3),
        f=reshape(v,[count(3),count(2),count(1)]);
    elseif (length(start) == 4),
        f=reshape(v,[count(4),count(3),count(2)]);
    end,
    
    %  Read in a 4D-array.
    
elseif (nvdims == 4),
    [v,status]=mexcdf('ncvarget',ncid,varid,start,count);
    if (status == -1),
        error(['NCREAD: ncvarget - error while reading: ',vname])
    end,
    if (length(start) == 4),
        f=reshape(v,[count(4),count(3),count(2),count(1)]);
    elseif (length(start) == 5),
        f=reshape(v,[count(5),count(4),count(3),count(2)]);
    end,
    
end,

% Print information about variable.

if (IPRINT),
    if (nvdims > 0),
        disp('  ')
        disp([vname ' has the following dimensions (input order):']);
        disp('  ')
        for n=1:nvdim,
            s=['           '  int2str(n) ') ' dimnam(n,:) ' = ' int2str(dimsiz(n))];
            disp(s);
        end,
        disp('  ')
        disp([vname ' loaded into an array of size:  [' int2str(size(f)) ']']);
        disp('  ')
    else
        disp('  ')
        disp([vname ' is a scalar and has a value of ',num2str(f)]);
        disp('  ')
    end,
end,

%----------------------------------------------------------------------------
% Close NetCDF file.
%----------------------------------------------------------------------------

[status]=mexcdf('ncclose',ncid);
if (status == -1),
    error(['NCREAD: ncclose - unable to close NetCDF file.'])
end

return
